// Program rozwiązuje układ równań liniowych o n niewiadomych
// za pomocą metody wyznacznikowej Cramera. n <= 8

function det(stopien, wiersz, wk, A)
{

  var i,j,k,m;
  var kolumny = new Array(8); // wektor kolumn dla podmacierzy
  var suma;



  if(stopien == 1)

    return A[wiersz][wk[0]];

  else

  {

    suma = 0; m = 1;

    for(i = 0; i < stopien; i++)

    {

      k = 0;

      for(j = 0; j < stopien - 1; j++)

      {

        if(k == i) k++;

        kolumny[j] = wk[k++];

      }

      suma += m * A[wiersz][wk[i]] * det(stopien - 1, wiersz + 1, kolumny, A);

      m = -m;

    }

    return suma;

  }

}

function main()
{

  var EPS = 0.0000000001; // dokładność porównania z zerem

  var i,j,k,n,W,t,s,z;

  var WK = new Array(8);

  var AB = new Array(8);

  var X  = new Array(8);



// Dane dla programu odczytujemy z pola tekstowego.

// Pierwszy wiersz pola powinien zawierać liczbę n

// Następne n kolejnych wierszy powinno zawierać współczynniki ai dla

// tego wiersza, a na końcu współczynnik bi. Kolejne współczynniki

// oddzielone są od siebie przynajmniej jedną spacją.



  t = "<font color=red><b>Złe dane</b></font>";

  s = document.frmbincode.input.value;

  if(s.length > 0)

  {

// Odczytujemy współczynniki z pola tekstowego

    while((j = s.indexOf('\n')) != -1)

      s = s.substring(0,j) + " " + s.substring(j + 1,s.length);

    while((j = s.indexOf('\r')) != -1)

      s = s.substring(0,j) + " " + s.substring(j + 1,s.length);

    while((j = s.indexOf('\t')) != -1)

      s = s.substring(0,j) + " " + s.substring(j + 1,s.length);

    while(s.length > 0 && (s.charAt(0) == " "))

      s = s.substring(1,s.length);

    while(s.length > 0 && (s.charAt(s.length-1) == " "))

      s = s.substring(0,s.length - 1);

    while(s.length > 0 && ((j = s.indexOf("  ")) != -1))

      s = s.substring(0,j) + s.substring(j+1,s.length);

    s = s.split(' ');

    if(s.length > 0)

    {

      n = parseInt(s[0]);

      if((!isNaN(n)) && (s.length >= n * (n + 1) + 1) && (n < 9))

      {

        k = 1;

        z = true;

        for(i = 0; i < n; i++)

        {

          AB[i] = new Array(n + 1);

          for(j = 0; j <= n; j++)

            z = z && !isNaN(AB[i][j] = parseFloat(s[k++]));

        }

        if(z)

        {

 

// Wyświetlamy układ równań



          t = "<table border='0' cellpadding='4' style='border-collapse: collapse'>";

          t += "<tr><td>";

          for(i = 0; i < n; i++)

          {

            for(j = 0; j <= n; j++)

            {

              if(!j) t += AB[i][j];

              else if (j == n) t += " = " + AB[i][j];

              else t += (AB[i][j] < 0) ? " - " + Math.abs(AB[i][j]) : " + " + AB[i][j];

              if(j < n) t += "x<sub>" + (j + 1) + "</sub>";

            }

            t += "<br>";

          } 

          t += "</td></tr><tr><td>";



// Obliczamy wyznacznik główny



          for(i = 0; i < n; i++) WK[i] = i;

          W = det(n,0,WK,AB);

          if(Math.abs(W) < EPS)

             t += "<font color=red><b>Brak rozwiazania</b></font>";

          else

          {



// Obliczamy kolejne wyznaczniki Wi



            for(i = 0; i < n; i++)

            {

              WK[i] = n; // podmieniamy kolumnę współczynnikami bi

              X[i]  = det(n,0,WK,AB) / W;

              WK[i] = i; // przywracamy kolumnę współczynników ai

            }



// Wypisujemy wyniki do okna konsoli oraz do pliku out.txt



            for(i = 0; i < n; i++)

               t += "x<sub>" + (i + 1) + "</sub> = " + X[i] + "<br>";

            t += "</td></tr></table>";

          }         

        }

      }

    }

  }
  document.getElementById("out").innerHTML = t;
}
